package com.ytzl.service.impl;

import cn.hutool.crypto.SecureUtil;
import com.ytzl.common.Constants;
import com.ytzl.common.UserAgentUtil;
import com.ytzl.config.RedisAPI;
import com.ytzl.model.ItripUser;
import com.ytzl.service.TokenService;
import cz.mallat.uasparser.UserAgentInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.UUID;

@Service
@Slf4j
public class TokenServiceImpl implements TokenService {

    //token前缀
    public final String TOKEN_PREFIX="token";

    @Autowired
    private RedisAPI redisAPI;

    private long expire= Constants.SESSION_EXPIRE;

    @Override
    public String createToken(String agent, ItripUser itripUser) {
        //自定义token的数据格式：前缀+客户端设备类型+userCode+userId+时间戳+6位随机数
        StringBuffer token=new StringBuffer();
        try {
            token.append(TOKEN_PREFIX).append(":");
            //获取客户端设备类型
            UserAgentInfo parse= UserAgentUtil.getUasParser().parse(agent);
            String deviceType = parse.getDeviceType();
            //检测是否是移动端设备
            if(deviceType.equals(UserAgentInfo.UNKNOWN)){
                if(UserAgentUtil.CheckAgent(agent)){
                    token.append("MOBILE");
                }else{
                    token.append("PC");
                }
            }else if(deviceType.equals("Personal computer")){
                token.append("PC");
            }else{
                token.append("MOBILE");
            }
            System.out.println("设备类型"+deviceType);

            //2.获取token需要的其他信息
            //加密的userCode
            String userCodeMd5 = SecureUtil.md5(itripUser.getUsercode());
            token.append("-").append(userCodeMd5);
            //用户ID
            Long userId = itripUser.getId();
            token.append("-").append(userId);
            //当前时间戳
            String time = new SimpleDateFormat("yyyyMMddhhmmss").format(new Date());
            token.append("-").append(time);
            //6位数随机
            String uuid = UUID.randomUUID().toString().replace("-", "");
            String random = uuid.substring(0,7);
            token.append("-").append(random);

            //3.返回token
            return token.toString();
        }catch (IOException e){
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void saveToken(String token, ItripUser itripUser) {
        System.out.println("================");
        //如果客户端是PC，则设置token的过期时间
        if(token.startsWith(TOKEN_PREFIX+":PC-")){
            redisAPI.set(token,itripUser,expire);
        }else{
            //如果客户端是移动设备，则不设置token过期时间
            redisAPI.set(token,itripUser);
        }
    }

    @Override
    public boolean validateToken(String agent, String token) {
        //没有token返回false
        if (redisAPI.hasKey(token)) {
           return false;
        }
        //如果有token，需要验证该token是否在有效期内
        String[] chars=token.split("-");
        //从token中获取token创建的时间
        String charForTime=chars[3];
        //转化时间格式
        try {
            Date date = new SimpleDateFormat("yyyyMMddhhmmss").parse(charForTime);
            //当前时间
            long nowTime= Calendar.getInstance().getTimeInMillis();
            long tokenCreateTime=date.getTime();
            long betweenTime=nowTime-tokenCreateTime;
            //用当前时间被创建的token的时间相减
            //如果区间值是大于系统设置的token过期时间
            //侧表示该token已经失效
            if (betweenTime> Constants.SESSION_EXPIRE) {
                return false;
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return false;
    }
}
